// 言简意赅，infer就是推导泛型参数

// infer声明只能出现在extends子语句中

// 获取promise返回的参数
/* interface UserInfer {
  name: string;
  age: number;
}

type PromiseType = Promise<Promise<Promise<UserInfer>>>

type GetPromiseType<T> = T extends Promise<infer U> ? GetPromiseType<U> : T

type T = GetPromiseType<PromiseType>; // 此时T为UserInfer */

// infer协变
// 产生协变会返回联合类型
/* let objInfer = {
  name: '张三',
  age: 20
}

type Bar<T> = T extends {name: infer U, age: infer U} ? U : T
type T = Bar<typeof objInfer> // 此时T为string */

// infer逆变
// 一般出现在函数的参数上面
// 逆变返回的是交叉类型
type a = number & string  // never

type Bar<T> = T extends {
  a:(x:infer U) => void,
  b:(x:infer U) => void,
} ? U : 'fdsfds'

type T = Bar<{a:(x: number) => void, b:(x: string) => void}> // 此时T为number & string



